package com.tjetc.component;

import com.tjetc.BeanPostProcessor;
import com.tjetc.MyAspect;
import com.tjetc.annotation.Component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 后置处理器的实现类 对所有的bean都生效
 *
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/9/3
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 日志，权限 等业务进行处理 省略处理过程
        System.out.println("postProcessBeforeInitialization方法调用 bean=" + bean + ",名字=" + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        //AOP的处理位置
        System.out.println("postProcessAfterInitialization方法调用 bean=" + bean + ",名字=" + beanName);

        // 我们这里为了方便 只对一个固定的方法进行增强
        if (beanName.equals("userDaoImpl")) {
            // 这里需要使用jdk动态代理
            Object proxyInstance = Proxy.newProxyInstance(
                    MyBeanPostProcessor.class.getClassLoader(),
                    bean.getClass().getInterfaces(),
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println(method.getName());
                            Object result = null;
                            // 这个地方应该是动态的 通过注解
                            if ("f".equals(method.getName())) {
                                MyAspect.showBeforeLog();
                                result = method.invoke(bean, args);
                                MyAspect.showAfterLog();
                            } else {
                                result = method.invoke(bean, args);
                            }
                            return result;
                        }
                    }
            );
            // 如果进行增强了 那么就需要返回一个代理对象而不是原始的bean对象
            return proxyInstance;
        }
        return bean;
    }
}